<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>

  <div id="box">
    {{text}}
    <hr>
    {{arr}}
    <button @click="btn">点击修改数组</button>
    <br>
    {{obj}}
    <button @click="btn1">点击修改对象</button>
    <hr>
    <button @click="handle2">按钮===nextTick</button>
    <ul>
      <li>这是1个li</li>
      <li id="box" v-if="flag">这是2个li</li>
    </ul>
  </div>

  <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.7.14/vue.js"></script>
  <script>


    new Vue({
      el: '#box',
      data: {
        text: 'hello Vue',
        arr: [1, 3, 5, 7, 9],
        obj: {
          age: 18
        },
        flag: false
      },
      methods: {
        //$set,解决数据变了视图没有更新
        btn() {
          this.arr[0] = 123//实际上是改变了,但是视图没有更新
          //如果修改了数组某一项的值,页面没有渲染出来,可以使用.$set方法
          // this.$set(数据源, 数组下标, 新的值);
          this.$set(this.arr, 1, 50);
          console.log(this.arr);
        },
        btn1() {
          //可以修改对象的属性值,但是不能添加属性名到对象中
          this.obj.age++//可以改变
          this.obj['种族'] = '德玛'//实际上添加了,但是视图没有更新,页面没有渲染
          console.log(this.obj);
          //同理如果是操作对象添加属性,页面没有渲染出来,可以使用.$set方法
          // this.$set(数据源, 属性名, 新的值);
          this.$set(this.obj, 'name', 'xiaojue');
        },
        handle2() {
          /* 解决获取dom问题 */
          this.flag = !this.flag
          /* 场景：开始元素是移除状态，后来是添加显示的，显示后获取dom，获取不到
          需要使用nextTick来解决这个问题
          面试题：如果元素是动态显示，获取不到dom元素如何解决
          答：需要使用 $nextTick
          继续问：他是如何实现的，实现的原理是什么
          为什么不是呀定时器而需要使用 nextTick
          因为定时器无法精准的判断元素何时添加完成，而 nextTick可以实时监听dom元素添加完成就立刻执行
          */
          this.$nextTick(() => {
            var box = document.querySelector('#box')
            console.log(box, 888);
          })
          // setTimeout(() => {
          //   var box = document.querySelector('#box')
          //   console.log(box, 888);
          // }, 3000)

        }
      }


    })




  </script>

</body>

</html>